package Soligee.model.vo.lancamentos;

import Soligee.model.vo.cadastros.FornecedorVO;
import Soligee.model.vo.cadastros.ParcelaNFEntradaVO;
import Soligee.model.vo.cadastros.ProdutoVO;
import java.io.Serializable;
import java.util.Collection;
import javax.persistence.*;
import java.util.Date;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity
@Table(name = "nfentrada")
public class NFEntradaVO implements Serializable {

    @Id
    @SequenceGenerator(name = "cod_nf_entrada", sequenceName = "cod_nf_entrada_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "cod_nf_entrada")
    @Column(name = "cod_nf_entrada", nullable = false)
    private int codNFEntrada;
    @Column(name = "numero_nf", nullable = false)
    private int numeroNFEntrada;
    @Column(name = "dataemissao", nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Date dataEmissao;
    @Column(name = "dataentrada", nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Date dataEntrada;
    @Column(name = "qtdade_parcela", nullable = false)
    private int qtdadeParcela;
    @Column(name = "percentualipi", nullable = false)
    private double percentualIPI;
    @Column(name = "percentualdesconto", nullable = false)
    private double percentualDesconto;
    @Column(name = "percentualembalagem", nullable = false)
    private double percentualEmbalagem;
    @Column(name = "percentualfrete", nullable = false)
    private double percentualFrete;
    @Column(name = "valortotalnota", nullable = false)
    private double valorTotalNota;
    @Column(name = "valortotalproduto", nullable = false)
    private double valorTotalProduto;
    @Column (name="ativo", nullable = false)
    private boolean ativo;
    
    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "itens_nfentrada",
    joinColumns = {@JoinColumn(name = "cod_nf_entrada")},
    inverseJoinColumns = {@JoinColumn(name = "cod_produto")})
    @Cascade(CascadeType.SAVE_UPDATE)
    private Collection<ProdutoVO> produtos;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "cod_fornecedor", insertable = true, updatable = true, nullable = false)
    @Fetch(FetchMode.JOIN)
    @Cascade(CascadeType.SAVE_UPDATE)
    private FornecedorVO fornecedor;

    @OneToMany(mappedBy = "nfEntrada", fetch = FetchType.LAZY)
    @Cascade(CascadeType.SAVE_UPDATE)
    private Collection<ParcelaNFEntradaVO> parcelas1;

    public NFEntradaVO() {
    }

    public NFEntradaVO(int codNFEntrada, Date dataEmissao, Date dataEntrada, int numeroNFEntrada, int qtdadeParcela,
            double percentualIPI, double percentualFrete, double percentualDesconto,
            double percentualEmbalagem, double valorTotalProduto,
            double valorTotalNota, FornecedorVO fornecedor) {
        this.setCodNFEntrada(codNFEntrada);
        this.setNumeroNFEntrada(numeroNFEntrada);
        this.setDataEmissao(dataEmissao);
        this.setDataEntrada(dataEntrada);
        this.setQtdadeParcela(qtdadeParcela);
        this.setPercentualIPI(percentualIPI);
        this.setPercentualFrete(percentualFrete);
        this.setPercentualDesconto(percentualDesconto);
        this.setPercentualEmbalagem(percentualEmbalagem);
        this.setValorTotalProduto(valorTotalProduto);
        this.setValortotalnota(valorTotalNota);
        this.setFornecedor(fornecedor);
        this.setAtivo(true);
    }

    public Date getDataEmissao() {
        return dataEmissao;
    }

    //metodo seta a data automaticamente pelo sistema
    public void setDataEmissao(Date dataEmissao) {
        this.dataEmissao = dataEmissao;
    }

    public Date getDataEntrada() {
        return dataEntrada;
    }

    public void setDataEntrada(Date data) {
        this.dataEntrada = data;
    }

    public int getCodNFEntrada() {
        return codNFEntrada;
    }

    public void setCodNFEntrada(int codNFEntrada) {
        this.codNFEntrada = codNFEntrada;
    }

    public int getNumeroNFEntrada() {
        return numeroNFEntrada;
    }

    public void setNumeroNFEntrada(int numeroNFEntrada) {
        this.numeroNFEntrada = numeroNFEntrada;
    }

    public double getPercentualDesconto() {
        return percentualDesconto;
    }

    public void setPercentualDesconto(double percentualDesconto) {
        this.percentualDesconto = percentualDesconto;
    }

    public double getPercentualEmbalagem() {
        return percentualEmbalagem;
    }

    public void setPercentualEmbalagem(double percentualEmbalagem) {
        this.percentualEmbalagem = percentualEmbalagem;
    }

    public double getPercentualIPI() {
        return percentualIPI;
    }

    public void setPercentualIPI(double percentualIPI) {
        this.percentualIPI = percentualIPI;
    }

    public int getQtdadeParcela() {
        return qtdadeParcela;
    }

    public void setQtdadeParcela(int qtdadeParcela) {
        this.qtdadeParcela = qtdadeParcela;
    }

    public Collection<ProdutoVO> getProduto() {
        return getProdutos();
    }

    public void setProduto(Collection<ProdutoVO> produto) {
        this.setProdutos(produto);
    }

    public double getPercentualFrete() {
        return percentualFrete;
    }

    public void setPercentualFrete(double percentualFrete) {
        this.percentualFrete = percentualFrete;
    }

    public double getValorTotalNota() {
        return valorTotalNota;
    }

    public void setValortotalnota(double valorTotalNota) {
        this.valorTotalNota = valorTotalNota;
    }

    public double getValorTotalProduto() {
        return valorTotalProduto;
    }

    public void setValorTotalProduto(double valorTotalProduto) {
        this.valorTotalProduto = valorTotalProduto;
    }

    public FornecedorVO getFornecedor() {
        return fornecedor;
    }

    public void setFornecedor(FornecedorVO fornecedor) {
        this.fornecedor = fornecedor;
    }

    public boolean isAtivo() {
        return ativo;
    }

    public void setAtivo(boolean ativo) {
        this.ativo = ativo;
    }

    public Collection<ProdutoVO> getProdutos() {
        return produtos;
    }

    public void setProdutos(Collection<ProdutoVO> produtos) {
        this.produtos = produtos;
    }

    public Collection<ParcelaNFEntradaVO> getParcelas() {
        return parcelas1;
    }

    public void setParcelas(Collection<ParcelaNFEntradaVO> parcelas) {
        this.parcelas1 = parcelas;
    }
}